home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
pcr
/
pcr4_4.lha
/
DIST
/
gc
/
GCutilities.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-06-06
|
4KB
|
190 lines
/* begincopyright
Copyright (c) 1988,1990 Xerox Corporation. All rights reserved.
Use and copying of this software and preparation of derivative works based
upon this software are permitted. Any distribution of this software or
derivative works must comply with all applicable United States export
control laws. This software is made available AS IS, and Xerox Corporation
makes no warranty about the software, its performance or its conformity to
any specification. Any person obtaining a copy of this software is requested
to send their name and post office or electronic mail address to:
PCR Coordinator
Xerox PARC
3333 Coyote Hill Rd.
Palo Alto, CA 94304
endcopyright */
/*
* Weiser
*
* Demers, February 12, 1990 12:44:19 pm PST
* Boehm, March 26, 1990 12:51:22 pm PST
*/
#include <xr/GCPrivate.h>
unsigned
XR_GCHeapSize()
{
return GC_heapsize;
}
unsigned
XR_GCTotalObjectCount()
{
return (GC_objects_allocd + GC_objects_allocd_before_gc);
}
unsigned
XR_GCCurrentObjectCount()
{
return (GC_objects_in_use + GC_objects_allocd);
}
unsigned
XR_GCTotalByteCount()
{
return WORDS_TO_BYTES(GC_words_allocd + GC_words_allocd_before_gc);
}
unsigned
XR_GCCurrentByteCount()
{
return WORDS_TO_BYTES(GC_atomic_in_use + GC_composite_in_use
+ GC_words_allocd);
}
bool
XR_GCSetNeverCollectAtAll(arg)
{
bool old_value = GC_dont_gc;
GC_dont_gc = arg;
return old_value;
}
XR_GCGetNeverCollectAtAll()
{
return GC_dont_gc;
}
bool
XR_GCSetMarkCarefully(arg)
{
bool old_value = GC_markCarefully;
GC_markCarefully = arg;
return old_value;
}
unsigned
XR_GCSetMode(arg)
unsigned arg;
{
unsigned old_value;
if (arg == GC_PARALLEL) {
GC_iprintf("Currently PARALLEL ==> INCREMENTAL\n");
arg |= GC_INCREMENTAL;
}
# ifndef DIRTY_BITS
if (arg & DIRTY_BITS_REQUIRED) {
GC_iprintf("Parallel/incremental collection not possible\n");
arg &= ~DIRTY_BITS_REQUIRED;
}
# endif
GC_requested_mode = arg;
return(old_value);
}
bool
XR_GCGetMarkCarefully()
{
return GC_markCarefully;
}
void
XR_RegisterGCCallBackBefore(before, clientdata, oldbefore, oldclientdata)
RegisterGCCallbackType before;
XR_Pointer clientdata;
RegisterGCCallbackType *oldbefore;
XR_Pointer *oldclientdata;
{
XR_MonitorEntry(&GC_allocate_ml);
if (oldbefore) *oldbefore = GC_callBackBefore;
if (oldclientdata) *oldclientdata = GC_callBackBeforeClientData;
GC_callBackBefore = before;
GC_callBackBeforeClientData = clientdata;
XR_MonitorExit(&GC_allocate_ml);
}
void
XR_RegisterGCCallBackAfter(after, clientdata, oldafter, oldclientdata)
RegisterGCCallbackType after;
XR_Pointer clientdata;
RegisterGCCallbackType *oldafter;
XR_Pointer *oldclientdata;
{
XR_MonitorEntry(&GC_allocate_ml);
if (oldafter) *oldafter = GC_callBackAfter;
if (oldclientdata) *oldclientdata = GC_callBackAfterClientData;
GC_callBackAfter = after;
GC_callBackAfterClientData = clientdata;
XR_MonitorExit(&GC_allocate_ml);
}
void
XR_RegisterGCCallBackDuringInner(during, clientdata, oldduring, oldclientdata)
RegisterGCCallbackType during;
XR_Pointer clientdata;
RegisterGCCallbackType *oldduring;
XR_Pointer *oldclientdata;
{
if (oldduring) *oldduring = GC_callBackDuring;
if (oldclientdata) *oldclientdata = GC_callBackDuringClientData;
GC_callBackDuring = during;
GC_callBackDuringClientData = clientdata;
}
unsigned
XR_SetBytesAfterWhichToCollect(bytes)
unsigned bytes;
{
int oldValue;
if (GC_mode != 0) {
oldValue = GC_partial_gc_allocs;
GC_partial_gc_allocs = GC_full_gc_allocs = bytes;
} else {
oldValue = GC_full_gc_allocs;
GC_full_gc_allocs = bytes;
}
return oldValue;
}
unsigned
XR_GetBytesAfterWhichToCollect()
{
if (GC_mode != 0) {
return GC_partial_gc_allocs;
} else {
return GC_full_gc_allocs;
}
}
void
XR_CollectOnlyWhenFull()
{
(void) XR_SetBytesAfterWhichToCollect(0);
}
void
XR_CollectAfterOneMegabyte()
{
(void) XR_SetBytesAfterWhichToCollect(1024*1024);
}
void
XR_CollectAfterTwoMegabytes()
{
(void) XR_SetBytesAfterWhichToCollect(1024*1024*2);
}